package org.dicr.gui;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*;

import org.dicr.event.*;
import org.dicr.gui.layout.*;

/***********************************************************************************************************************
 * <p>
 * Title: DiJaWo
 * </p>
 * <p>
 * Description: Dicr Java Utilites
 * </p>
 * <p>
 * Copyright: (C) by Dicr 2002
 * </p>
 * <p>
 * Company: Dicr
 * </p>
 * 
 * @author Igor A Tarasov me@dicr.dn.ua
 * @version 030122
 **********************************************************************************************************************/
public class DicrDialog extends JDialog {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	// содержимое
	DicrDialogContent content = null;

	// панель управления
	protected JPanel controlPanel = new JPanel();

	// типы диалога
	// без кнопок
	public static final int DIALOG_SIMPLE = 1;

	// с кнопкой Ok
	public static final int DIALOG_OK = 2;

	// с кнопками Yes No
	public static final int DIALOG_YES_NO = 3;

	// тип диалога
	protected int type = -1;

	// кнопки
	protected JButton acceptButton = new JButton("Принять");

	protected JButton canselButton = new JButton("Отменить");

	// результат выбора
	protected boolean accepted = false;

	// слушатель содержимого
	protected ContentListener contentListener = new ContentListener();

	/*******************************************************************************************************************
	 * Конструктор
	 ******************************************************************************************************************/
	protected DicrDialog(Component parent, String title, int theType) {
		super(JOptionPane.getFrameForComponent(parent), title, true);
		try {
			jbInit(theType);
			this.pack();
		} catch (Exception ex) {
			DicrExceptionHandler.handleException(ex, this);
		}
	}

	/*******************************************************************************************************************
	 * Конструктор
	 ******************************************************************************************************************/
	public DicrDialog(Component parent, String title, int theType, DicrDialogContent theContent) {
		this(parent, title, theType);
		try {
			jbInit(theContent);
			this.pack();
			/**
			 * todo: Плохо работает метод setRelativeLocation Лучше его использовать в последующих реализациях если
			 * исправят. Пока просто центрируем окно
			 */
			// this.setLocationRelativeTo(parent);
			GuiMisc.centerComponentToScreen(this);
		} catch (Exception ex) {
			DicrExceptionHandler.handleException(ex, this);
		}
	}

	/*******************************************************************************************************************
	 * Инициализация
	 ******************************************************************************************************************/
	private void jbInit(int theType) {
		this.type = theType;

		Container container = this.getContentPane();
		container.setLayout(new BorderLayout());

		this.controlPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		this.acceptButton.addActionListener(new ButtonsListener());
		this.canselButton.addActionListener(new ButtonsListener());

		switch (theType) {
			case DIALOG_YES_NO:
				container.add(this.controlPanel, BorderLayout.SOUTH);
				this.controlPanel.setLayout(new PnutsLayout("cols=2, padx=5, pady=5, expand=x"));
				this.controlPanel.add(this.acceptButton);
				this.controlPanel.add(this.canselButton);
				break;
			case DIALOG_OK:
				container.add(this.controlPanel, BorderLayout.SOUTH);
				this.controlPanel.add(this.acceptButton);
				break;
		}
		this.getRootPane().setDefaultButton(this.acceptButton);
	}

	/*******************************************************************************************************************
	 * Инициализация
	 ******************************************************************************************************************/
	private void jbInit(DicrDialogContent theContent) {
		this.content = theContent;

		JComponent comp = (JComponent) theContent;
		Container container = this.getContentPane();
		container.add(comp, BorderLayout.CENTER);

		comp.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new CompoundBorder(new BevelBorder(
		        BevelBorder.RAISED), new EmptyBorder(5, 5, 5, 5))));
		theContent.addContentListener(this.contentListener);
	}

	/*******************************************************************************************************************
	 * Установка текста кнопки "Приять"
	 ******************************************************************************************************************/
	public void setAcceptButtonText(String text) {
		this.acceptButton.setText(text);
	}

	/*******************************************************************************************************************
	 * Установка текста кнопки "Отменить"
	 ******************************************************************************************************************/
	public void setCanselButtonText(String text) {
		this.canselButton.setText(text);
	}

	/*******************************************************************************************************************
	 * Возвращает результат диалога
	 ******************************************************************************************************************/
	public boolean isAccepted() {
		return this.accepted;
	}

	/*******************************************************************************************************************
	 * Завершение работы диалога
	 ******************************************************************************************************************/
	protected void shutdown() {
		dispose();
		this.content.removeContentListener(this.contentListener);
		if (this.type != DIALOG_YES_NO) this.content.shutdown();
	}

	/*******************************************************************************************************************
	 * ######################################################################### Слушатель кнопок
	 * #########################################################################
	 ******************************************************************************************************************/
	class ButtonsListener implements ActionListener {
		@Override
        public void actionPerformed(ActionEvent e) {
			Object src = e.getSource();
			if (src == DicrDialog.this.acceptButton) DicrDialog.this.accepted = true;
			shutdown();
		}
	}

	/*******************************************************************************************************************
	 * ######################################################################### Слушатель окна
	 * #########################################################################
	 ******************************************************************************************************************/
	class DialogListener extends WindowAdapter {
		@Override
		public void windowClosing(WindowEvent e) {
			shutdown();
		}
	}

	/*******************************************************************************************************************
	 * ######################################################################### Слушатель содержимого
	 * #########################################################################
	 ******************************************************************************************************************/
	class ContentListener implements ProgramListener {
		@Override
        public void eventPerformed(ProgramEvent e) {
			boolean enabled = ((Boolean) e.getParam()).booleanValue();
			DicrDialog.this.acceptButton.setEnabled(enabled);
		}
	}
}
